"""
输出管理模块
"""

import numpy as np
import pandas as pd
from pathlib import Path
from typing import Dict, Any
from .exceptions import FileIOError


class OutputManager:
    """输出管理器类"""
    
    def __init__(self, output_dir: str = 'output'):
        """
        初始化输出管理器
        
        Args:
            output_dir: 输出目录路径
        """
        self.output_dir = Path(output_dir)
        self.output_dir.mkdir(exist_ok=True)
    
    def save_processed_data(self, 
                          labels: np.ndarray,
                          processed_data: np.ndarray,
                          combination: Dict[str, Any],
                          original_filename: str) -> str:
        """
        保存预处理后的数据到Excel文件
        
        Args:
            labels: 分类标签
            processed_data: 预处理后的光谱数据
            combination: 预处理组合信息
            original_filename: 原始文件名
            
        Returns:
            str: 输出文件路径
        """
        try:
            # 生成输出文件名
            output_filename = self.generate_filename(original_filename, combination)
            output_path = self.output_dir / output_filename
            
            # 创建DataFrame，第一列为标签，其余列为光谱数据
            df_data = np.column_stack([labels, processed_data])
            
            # 生成列名
            columns = ['分类ID'] + [f'波长_{i+1}' for i in range(processed_data.shape[1])]
            df = pd.DataFrame(df_data, columns=columns)
            
            # 保存到Excel文件
            df.to_excel(output_path, index=False)
            
            return str(output_path)
            
        except Exception as e:
            raise FileIOError(f"保存文件失败: {str(e)}")
    
    def generate_filename(self, original_filename: str, combination: Dict[str, Any]) -> str:
        """
        生成输出文件名
        
        Args:
            original_filename: 原始文件名
            combination: 预处理组合信息
            
        Returns:
            str: 生成的文件名
        """
        # 获取原始文件名（不含扩展名）
        base_name = Path(original_filename).stem
        
        # 获取组合名称
        combination_name = combination['name']
        
        # 生成新文件名
        return f"{base_name}_{combination_name}.xlsx"
    
    def validate_output(self, file_path: str) -> bool:
        """
        验证输出文件的完整性
        
        Args:
            file_path: 输出文件路径
            
        Returns:
            bool: 文件是否有效
        """
        try:
            path = Path(file_path)
            if not path.exists():
                return False
            
            # 尝试读取文件验证格式
            df = pd.read_excel(file_path)
            return not df.empty
            
        except Exception:
            return False